package com.fjbdxk.beidou.bd;

import java.util.LinkedList;
import java.util.List;

/**
 * 用于存放一个设备（风机）的数据，以方便形成报文
 * 存储与设备相关的数据值。它限制了设备数据的数量（size）在一定范围内，并且能够存储多个 DeviceData 对象。构造函数确保在创建对象时提供有效的参数，并初始化必要的字段和数据结构
 * 是一个用于管理设备数据的工具类，能够存储多个设备数据项，并提供将这些数据序列化为字节数组的功能
 */
public class DeviceValues4Send {
    final int BUF_SIZE_MAX = 32;//表示缓冲区的最大大小（32字节）,代表了设备数据打包时的最大字节数
    final int size;//设备数据数量
    List<DeviceData> list;//存储设备数据列表
    final int devIdOrBias;//存储设备标识符或时间偏移量

    DeviceValues4Send(int size, int devIdOrBias) {
        assert size > 0 && size < 48;
        this.devIdOrBias = devIdOrBias;
        this.size = size;
        list = new LinkedList<>();
    }

    DeviceValues4Send(int devIdOrBias) {
        this(10, devIdOrBias);
    }

    /**
     * 增加待发送的设备（风机）数据
     * 向设备值列表中添加新的设备数据项，方便管理和存储设备数据
     * @param config
     * @param value
     * @return
     */
    boolean addValue(TagConfig config, double value) {//设备的配置和设备数据的值
        DeviceData data = new DeviceData(config, value);
        return list.add(data);
    }
    //将对象的状态（设备数据）转换为字节数组，以便于传输或存储，确保第一个字节包含设备的标识信息，后续字节包含实际的设备数据
    public byte[] getBytes() {
        byte[] pack = new byte[BUF_SIZE_MAX];
        pack[0] = (byte)(0xFF & devIdOrBias);  // 第0字节放设备序号或时间偏移量

        // 从第1字节开放放数据
        int idx = 1;
        for (DeviceData data : list) {
            byte[] buf = data.toBytes();
            for (byte b : buf) {
                pack[idx] = b;
                ++idx;
            }
        }

        byte[] resBytes = new byte[idx];
        System.arraycopy(pack, 0, resBytes, 0, idx);
        return resBytes;
    }
}
